/*------------------------------------------------------------------------------
 * PROJ : Prototype
 * NAME : sculove.spring.framework.tag.ComboTag.java
 *        
 * Copyright 2009 sculove All rights reserved
 *------------------------------------------------------------------------------
 */
package sculove.spring.framework.tag;

import java.util.HashMap;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import sculove.spring.framework.util.Configuration;
import sculove.spring.framework.util.SStringUtil;
import sculove.spring.zzz.comCd.model.ComCdDTO;
import sculove.spring.zzz.comCd.service.ComCdManager;
import sculove.spring.zzz.comCd.service.ComCdService;

/**
 * <pre>
 * sculove.spring.framework.tag.ComboTag.java
 * 
 * 공통콤보 처리를 위한 TAG
 * 
 * [공통코드 사용법]
 * - id : comCd가 존재하는 select element
 * - comCd : 코드[required] (하위코드인 경우. :로 구분)
 * - index : 선택되어지는 순번 (1부터시작. $붙은 경우는 코드와 일치한값을 선택)
 * - header : 선택(S), 전체(A)
 * 
 * 예) 
 * <f:combo id="combo1" comCd="IT001" index="2" header="S"/>		<!--순번-->
 * <f:combo id="combo2" comCd="IT002" index="$1001" header="A"/> 	<!--코드-->
 * <f:combo id="combo3" comCd="ZZ070:004" index="3" header="S"/>
 * 
 * </pre>
 * 
 * @date : 2009. 12. 12. 오후 4:53:34
 * @version :
 * @author : sculove
 */
public class ComCdTag extends TagSupport {
	private String id = "";
	private String comCd = "";
	private String index = "";
	private String header = "";
	
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getComCd() {
		return comCd;
	}

	public void setComCd(String comCd) {
		this.comCd = comCd;
	}

	public String getIndex() {
		return index;
	}

	public void setIndex(String index) {
		this.index = index;
	}

	public String getHeader() {
		return header;
	}

	public void setHeader(String header) {
		this.header = header;
	}

	@Override
	public int doStartTag() throws JspException {
		JspWriter out = pageContext.getOut();
		StringBuffer result = new StringBuffer();
		
		try {
			/*
			 * 1. Html Tag 기본 생성
			 */
			result.append("<SELECT id='")
				.append(id)
				.append("' comCd='")
				.append(comCd)
				.append("'>");

			/*
			 * 2. 전체, 선택 추가
			 */
			if("S".equals(header)) {	// 선택
				result.append("<OPTION value=''>")
					.append(Configuration.getPropInstance().getString("zzz.comCd.select"))
					.append("</OPTION>");															
			} else if (header == "A") {	// 전체
				result.append("<OPTION value='A'>")
				.append(Configuration.getPropInstance().getString("zzz.comCd.all"))
				.append("</OPTION>");						
			} 					

			// cbCd가 있는 경우 에만 처리
			if(SStringUtil.hasText(comCd)) {
				/*
				 * 2. 콤보 조회
				 */
				WebApplicationContext wc = WebApplicationContextUtils.getWebApplicationContext(pageContext.getServletContext());
				ComCdService service = (ComCdService)wc.getBean("zzz.comCdService");
				HashMap<String, ComCdDTO> cdList = new HashMap<String, ComCdDTO>();
				cdList.put(comCd, ComCdManager.getComCdDTO(comCd));
				HashMap<String, List<ComCdDTO>> resultList = service.inqComCd(cdList);
				List<ComCdDTO> resultCdList = resultList.get(comCd);
				
				if(SStringUtil.hasText(index)) {
					/*
					 * $가 있는 경우는 값을 비교하여 선택.
					 *    없는 경우는 인덱스로 설정
					 */
					for(int i=0; i<resultCdList.size(); i++) {
						ComCdDTO item = resultCdList.get(i);
						result.append("<OPTION value='")
							.append(item.getCd())
							.append("'");
						/*
						 *  $가 있고, cdNm과 cdIdx가 같은 경우. 또는 $가 없고,
						 *  cdIdx순번이 같은 경우(1부터시작)
						 */
						if( ( isCdValue(index) && item.getCd().equals(index.substring(1)) )	
								|| ( !isCdValue(index) && (i+1) == Integer.parseInt(index) ) ) {
								result.append(" selected>");
						} else result.append(">"); 
						result.append(item.getCdNm())
							.append("</OPTION>");
					}
				} else {
					for(ComCdDTO item : resultCdList) {
						result.append("<OPTION value='>")
							.append(item.getCd())
							.append("'>")
							.append(item.getCdNm())
							.append("</OPTION>");
					}
				}
			}
			result.append("</SELECT>");
			out.print(result.toString());
		} catch (Exception e) {
			Log logger = LogFactory.getLog(this.getClass());
			if (logger.isErrorEnabled()) {
				logger.error("ComCdTag Error!!!",e);
			}
			throw new JspException(e.getMessage());
		}

		return SKIP_BODY; // no body processing
	}

	/**
	 * 코드값으로 선택할경우. true   
	 * index로 선택할경우. false
	 * @param cbIdx
	 * @return
	 */
	private boolean isCdValue(String cbIdx) {
		return (cbIdx.indexOf("$") != -1);
	}
}
